home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 49
/
Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso
/
-serious-
/
misc
/
shellscr
/
src
/
paths.asm
< prev
next >
Wrap
Assembly Source File
|
1999-11-30
|
5KB
|
231 lines
; For copying DOS command paths
; Used in ShellScr by Kyzer/CSG
;
; Based on dospath.library source by Stefan Becker
; all functions withstand being passed NIL
call macro
move.l \2base(a4),a6
movem.l a0/a1/d1,-(sp)
jsr _LVO\1(a6)
movem.l (sp)+,d1/a0/a1
endm
clra macro
suba.l \1,\1
endm
baddr macro
add.l \1,\1
add.l \1,\1
endm
mkbaddr macro
asr.l #2,\1
endm
include dos/dos.i
include dos/dosextens.i
include exec/memory.i
include exec/nodes.i
include exec/ports.i
include exec/tasks.i
include exec/types.i
include lvo/dos_lib.i
include lvo/exec_lib.i
include workbench/startup.i
include eglobs.i
STRUCTURE PathList,0
BPTR pl_next
BPTR pl_lock
LABEL pl_SIZEOF
;------------------------------------------------------------------------------
; PTR TO commandlineinterface=getcli(PTR TO process) - private call
; d0=0 and Z flag set if not a process or no commandlineinterface
getcli moveq #0,d0
cmp.l d0,a0
beq.s .fail
cmp.b #NT_PROCESS,LN_TYPE(a0)
bne.s .fail
move.l pr_CLI(a0),d0
baddr d0
rts
.fail moveq #0,d0
rts
;------------------------------------------------------------------------------
; PTR TO pathlist=getpathlist(PTR TO process)
; returns a normal pointer to the initial pathlist entry of the process
xdef getpathlist__i
getpathlist__i
move.l 4(sp),a0
getpathlist
bsr.s getcli
beq.s .fail
move.l d0,a0
move.l cli_CommandDir(a0),d0
baddr d0
.fail rts
;------------------------------------------------------------------------------
; BPTR TO pathlist=getpath()
; makes a clone of 'your' pathlist. NOTE: returns BPTR, not PTR
xdef getpath
getpath move.l execbase(a4),a6
jsr _LVOForbid(a6)
move.l wbmessage(a4),d0 ; from eglobs.i
beq.s .getslf
move.l d0,a0
bsr.s getwbtask
bra.s .gottsk
.getslf suba.l a1,a1
jsr _LVOFindTask(a6)
.gottsk move.l d0,a0
bsr.s getpathlist
move.l d0,a0
bsr.s copypathlist
move.l d0,-(sp)
move.l execbase(a4),a6
jsr _LVOPermit(a6)
move.l (sp)+,d0
mkbaddr d0
rts
;------------------------------------------------------------------------------
; PTR TO process=getwbtask(PTR TO wbstartup)
; returns a pointer to the Workbench/Launcher's process
xdef getwbtask__i
getwbtask__i
move.l 4(sp),a0
getwbtask
move.l MN_REPLYPORT(a0),d0
bne.s .port
lea .wbname(pc),a1
move.l execbase(a4),a6
jmp _LVOFindTask(a6)
.port move.l d0,a0
move.l MP_SIGTASK(a0),d0
rts
.wbname dc.b 'Workbench',0
even
;------------------------------------------------------------------------------
; PTR TO pathlist=copypathlist(PTR TO pathlist)
; clone a pathlist
FROM equr A0
CURRENT equr A1
HEAD equr A2
NEXT equr A3 ;
ZERO equr D7 ; constant 0
tsta macro
cmp.l ZERO,\1
endm
xdef copypathlist__i
copypathlist__i
move.l 4(sp),FROM
copypathlist
movem.l d7/a2/a3,-(sp)
clra CURRENT
clra HEAD
clra NEXT
moveq #0,d7
.again
tsta FROM
beq.s .end
tsta NEXT
bne.s .gotmem
moveq #pl_SIZEOF,d0
moveq #MEMF_PUBLIC,d1
call AllocVec,exec
move.l d0,NEXT ; if (!NEXT) NEXT=AllocVec(sizeof(PathList), MEMF_PUBLIC)
.gotmem tsta NEXT ; if (!NEXT) { freepathlist(HEAD); return NULL; }
bne.s .got
move.l HEAD,a0
bsr.s freepathlist
moveq #0,d0
rts
.got
move.l pl_lock(FROM),d1
call DupLock,dos
move.l d0,pl_lock(NEXT)
beq.s .next
clr.l pl_next(NEXT)
tsta HEAD
bne.s .gothd
move.l NEXT,HEAD ; if (!HEAD) HEAD=NEXT
.gothd
tsta CURRENT
beq.s .nonext
move.l NEXT,d0
mkbaddr d0
move.l d0,pl_next(CURRENT)
.nonext move.l NEXT,CURRENT
clra NEXT
.next move.l pl_next(FROM),FROM ; FROM=BADDR(FROM.next)
baddr FROM
bra.s .again
.end move.l NEXT,a1
call FreeVec,exec
move.l HEAD,d0 ; return HEAD
.done movem.l (sp)+,d7/a2/a3
rts
;------------------------------------------------------------------------------
; freepathlist(PTR TO pathlist)
; frees a pathlist - note it takes a normal pointer, not a BPTR
xdef freepathlist__i
freepathlist__i
move.l 4(sp),a0
freepathlist
.again move.l a0,a1 ; current(a1) = next(a0)
moveq #0,d0
cmp.l d0,a1 ; end if current=0
beq.s .done
move.l pl_next(a1),a0 ; next=BADDR(current.next)
baddr a0
move.l pl_lock(a1),d1
call UnLock,dos ; d1=current.lock
call FreeVec,exec ; a1=current
bra.s .again
.done rts
;------------------------------------------------------------------------------
; PTR TO pathlist=setpathlist(PTR TO process,PTR TO pathlist)
; if a process, it will get it's pathlist set and return it's old process
xdef setpathlist__ii
setpathlist__ii
move.l 8(sp),a0
move.l 4(sp),a1
setpathlist
bsr getcli
beq.s .done ; return 0 if not a process in a0
move.l d0,a0
move.l cli_CommandDir(a0),d0 ; hold old pathlist
move.l a1,d1
beq.s .fail ; ignore install if no newlist
mkbaddr d1 ; MKBADDR(newlist)
move.l d1,cli_CommandDir(a0) ; install new list
.fail baddr d0 ; return BADDR(oldlist)
.done rts